package sol.cc;

import def.ListNode;
import utils.LinkedListUtils;

/**
 * 有两个用链表表示的整数，每个结点包含一个数位。这些数位是反向存放的，也就是个位排在链表的首部。编写函数对这两个整数求和，并用链表形式返回结果。
 */
public class Issue2_5 {
    public static ListNode plusAB(ListNode a, ListNode b) {
        // write code here
        return plusAB(a, b, 0);
    }

    //辅助函数，带有进位
    public static ListNode plusAB(ListNode a, ListNode b, int carry) {
        if (a == null && b == null && carry == 0)
            return null;

        int aVal = a == null ? 0 : a.val;
        int bVal = b == null ? 0 : b.val;
        int cVal = (aVal + bVal + carry) % 10;
        ListNode c = new ListNode(cVal);
        carry = (aVal + bVal + carry) / 10;
        c.next = plusAB(a == null ? null : a.next, b == null ? null : b.next, carry);
        return c;
    }

    public static void main(String[] args) {
        ListNode A = LinkedListUtils.create(7, 4, 0, 7, 5);
        ListNode B = LinkedListUtils.create(2, 7, 2, 3, 4);
        LinkedListUtils.print(plusAB(A, B));
    }
}
